perm filename TEST.SOS[ALS,ALS]1 blob
sn#158805 filedate 1975-05-16 generic text, type T, neo UTF8
00100 ;E -- DISPLAY EDITOR FOR STANFORD
00200 ;Written by Frederick H.G. Wright II
00300 ;with modifications by D. Poole, Art Samuel, and Stan Kugell.
00400 ;The Essay program was contracted by John Mccarthy and written by Stan Kugell
00500
00600 PRINTS /Type 0 to get ETV, 1 to get ESSAY, then <CTRL><META><LF>./
00700 ESSFLG←←.INSER TTY:
00800
00900 IFE ESSFLG<TITLE ETV -- DISPLAY EDITOR FOR STANFORD↔SUBTTL FREDERICK H.G. WRIGHT II
01000 PRINTS / You are assembling ETV, the Stanford Display Editor
01100 /
01200 PRINTS/ MAR.28,1975 E.29(P481) Apr.6 1975 E.31(P487) Apr.7 1975 E.32(P487)
01300 APR 10 1975 E.33(P487) APR 14 E.34
01400 E.32 contains code for TELLME but no automatic calling
01500 E.32 Reloaded on April 8 with minor corrections.
01600 E.33 With some automatic calling (checksum error and UFATAL calls) Apr. 10 1975.
01700 E.34 ALINE bug fixed Apr.14 1975
01800 E.35 Fix for file-directory disagreements. Apr. 18 1975
01900 />
02000
02100 IFN ESSFLG<TITLE ESSAY
02200 PRINTS / You are assembling Essay.
02300 />
02400 DEFINE ESSAY <IFN ESSFLG>
02500 DEFINE NOESS <IFE ESSFLG>
02600
02700 COMMENT ⊗ TO PUT UP A NEW E WITH AN UPPER SEGMENT, USE THE COMMANDS:
02800
02900 .LOA %SE%1<%2V%1B ;LOADS WITH SYMBOLS AND NNRAID IN THE UPPER SEGMENT
03000 .S 137 ;RENAMES UPPER, WRITE PROTECTS AND SETS ITS PROTECTION CONSTANT
03100 .SSAVE SYS E ;BE SURE TO SSave (to keep the UPPER SEGMENT around)
03200
03300 Early versions of E that were up for varying lengths of time:
03400 Nov. 6 1974. E.7 Nov. 8 1974. E.8 Nov.17 1974. E.10
03500 Nov.18 1974. E.10 Dec. 3 1974. E.12 Dec. 9 1974. E.15
03600 Dec.10 1974. E.16(P424) Dec.14 1974. E.17(P431) DEC.17 1974. E.18(P431)
03700 Dec.18 1974. E.19(P431) Jan.3 1975. E.20(P439 Jan.5,1975 E.21(P439)
03800 Jan.10,1975. E.22(P442) Jan 15,1975 E.23(P442) Mar.12,1975. E.26(P474)
03900 Mar.13,1975 E.27 Mar.17 1975 E.27(P477) Mar.19 1975 E.28(P477)
04000
04100 DATA STRUCTURE.
04200 A page of text is represented in memory as a theaded list of
04300 items each representing a single line of the text. Each item in this
04400 representation contains four words of header information, the text of
04500 the line in question and one trailer word.
04600 The first header word contains a TXTCOD, which for ordinary text
04700 is a 2 in the left half and the total number of words in the right half.
04800 This word is used by the free storage management routines. It does not
04900 seem to be used by the text manipulation sections of the code. The word
05000 count is duplicated in the trailer word which is also used only by the
05100 free storage routines.
05200 The second header word is a pointer word. It contains a
05300 backward pointer in the left half pointing to the location of the
05400 pointer word of the previous item and in the right half a forward
05500 pointer to the location of the pointer word of the next item. The
05600 location of the pointer word for the first item is contained in the word
05700 at PAGE and the backward pointer for the first item points back to
05800 PAGE. The last item on the page points to the word BOTSTR and this word
05900 points back to this last item and forward to itself. When in the ATTACH
06000 mode, the location ATTBUF points to the pointer word of the first
06100 attached line and back to the pointer word of the last attached line.
06200 The third word contains flag bits in the left half identifying
06300 the type of the line and two 9-bit bytes in the right half. Flag bits
06400 which have been identified are:
06500 400000 the line is a page mark.
06600 200000 the line is ARRLIN (CURRENT to which the arrow points).
06700 100000 the line is WINLIN (the first line on the window).
06800 040000 the line is an Essay reference (for the ESSAY version).
06900 The first byte in the right half contains the total count of the
07000 characters as the line is stored on the disk, where a TAB symbol counts
07100 1 and the terminating CR and LF are counted.
07200 The second byte contains the count of the characters as they are
07300 displayed where a TAB is counted as the number of spaces it produces and
07400 the terminating CR and LF are not counted.
07500
07600 The fourth word is the serial number of the line as kept in the
07700 core. This number is changed every time that a change is made to the line
07800 so this number then bears no relationship to the position of the line on
07900 the page.
08000
08100 The text occupies an integral number of words and is padded out
08200 with nulls.
08300 The trailer word contains the count of the total words in the
08400 item, including header and trailer words. This duplicates the
08500 information in the right half of the first header word.
08600
08700 TABs are handled in a pecular way. When a TAB occurs it is stored
08800 as a TAB and this is followed by as many spaces as the TAB in fact
08900 produces in the text and then by a terminating TAB.
09000
09100 end of comment ⊗
09200
09300 NOLIT
09400
09500 ;Register Most common usage
09600
09700 F←0 ;Flag bits
09800 A←1 ;Argument value
09900 B←2 ;CONTROL and META bits as stripped from command character.
10000 C←3 ;Character
10100 D←4 ;Dispatch table entry
10200 E←5 ;Table location.
10300 G←6
10400 H←7
10500 I←10
10600 DSP←11 ;Dispatch table location (CTAB most of the time).
10700 Q←14
10800 T←15
10900 TT←16
11000 P←17 ;Always reserved as PDL pointer.
11100
11200 DEFINE STOPJ
11300 {PUSHJ P,STOPJC
11400 }
11500 ;Used to replace JRST 4,. and other fatal halts to inform ALS of trouble
11600 ;STOPJ USED FOR JRST 4,. terminating with a JRST 4,. as usual
11700 ;STOPC used for JRST 4,. WHEN ATTEMPT IS MADE TO CONTINUE
11800
11900 IFNDEF PURESW<PURESW←←1> ;DEFAULT TO SHARABLE PURE UPPER SEGMENT
12000 IFNDEF DEBSW<DEBSW←←1>
12100 IFNDEF BOOKMD<BOOKMD←←1>
12200 ;BOOKMD NON-ZERO PERMITS /B MODE FOR READING BOOKS. 0 DISABLES /B MODE.
12300
12400 COPNUM←←3 ;LOG OF # K OF CORE FOR TEMP COPY BUFFER
12500 SRSIZ←←40 ;SIZE OF SEARCH STRING BUFFER
12600 LPDL←←69
12700 DPYBSZ←←=660*2
12800
12900 DSKI←←1
13000 DSKO←←2
13100 DSKSP←←4 ;Used for spooling file
13200 DSKCH←←5 ;Used to write into bug file TELLME.001[E,ALS] , .002 etc.
13300 SWP←←3
13400 IFN BOOKMD, {
13500 RPGO←←4 ;CHANNEL USED TO WRITE OUT .BKP FILE IN BKPSW MODE
13600 };END BOOKMD
13700
13800 ...←←0
13900
14000 ;Type of display (kept in cell called DPY)
14100 $TTY ←← 0 ;Teletype kludge
14200 $DD ←← 1 ;Datadisk video type display
14300 $III ←← 2 ;III Vector type display
00100 ;RIGHT HALF FLAGS
00200 REDNLY←←1 ;READ ONLY MODE
00300 COPY←←2 ;NEED TO DO COPY (← OR →)
00400 DIROK←←4 ;HAVE COMPLETE DIR
00500 UPDTXT←←10 ;LINE 1 CHANGED - UPDATE DIR AT WRPAGE
00600 WRITE←←20 ;SOMETHING CHANGED - NEED TO WRITE IT
00700 EOF←←40 ;INPUT EOF DETECTED - DO ANOTHER LOOKUP (LOSING SYSTEM!)
00800 EDDIR←←100 ;EDITING THE DIRECTORY PAGE
00900 ARG←←200 ;ARG WAS TYPED TO COMMAND
01000 DSPSCR←←400 ;REDISPLAY SCREEN
01100 DSPALL←←1000 ;REDISPLAY WHOLE SCREEN
01200 FILLUZ←←2000 ;EDITING NONSTANDARD FORMAT FILE
01300 REL←←4000 ;RELATIVE ARG (+ OR -)
01400 NEG←←10000 ;NEGATIVE ARG
01500 EDITM←←20000 ;DISPATCH IS FROM LINE EDIT
01600 EDBRK←←40000 ;(WITH EDITM) COMMAND TYPED IN MIDDLE OF LINE
01700 XPAGE←←100000 ;WILL EXPAND FILE FOR PAGE
01800 UPDIR←←200000 ;NON-TEXT CHANGE TO DIR
01900 ATTMOD←←400000 ;IN ATTACH MODE
02000
02100 ;LEFT HALF FLAGS
02200 ENTRD←←1 ;EDIT FILE HAS BEEN ENTERED
02300 CLRBF←←2 ;CLEAR OBUF AFTER OUTPUT
02400 NOSHUF←←4 ;DON'T SHUFFLE FREE STORAGE
02500 NOCHK←←10 ;DON'T TRY TO CORE DOWN
02600 OFFEND←←20 ;ARROW ON LINE N+1
02700 NULLIN←←40 ;CURRENT LINE IS EMPTY
02800 ARRPG←←100 ;ARROW POG IS SELECTED
02900 TF1←←200 ;TEMP FLAG
03000 PMLIN←←400 ;CURRENT LINE IS PAGE MARK
03100 OKF←←1000 ;SHOULD TYPE "OK"
03200 ;New flags added by ALS. May be represented by 3 bits if space gets tight.
03300 ALIN←←2000 ;ALINE FLAG
03400 INDEN←←4000 ;INDENT FLAG
03500 CEN←←10000 ;CENTER FLAG
03600 JOINF←←20000 ;JOIN FLAG
03700 ZATT←←40000 ;To save ATTACH on a Z-EPSIL command.
03800 ; 100000
03900 ; 200000
04000 NGPUSE←←400000 ;Network Graphic User
00100 ;CHARACTER TABLE FLAGS
00200 NSPEC←←400000 ;STANDARD SPECIAL CHAR (NULL OR RUBOUT) - MUST BE SIGN
00300 FSPC←200000 ;FILE NAME DELIMITER
00400 LSPC←←100000 ;SPECIAL CHAR IN LINE
00500 NUMF←←40000 ;DIGIT
00600 DSPC←←20000 ;SPECIAL DIR CHAR
00700 LETF←←10000 ;LETTER - WITH LT2F => LOWER CASE
00800 LT2F←←4000 ;ALONE => $%._
00900 SSP1←←2000 ;TYPE 1 SPECIAL SEARCH STRING CHAR
01000 SSP2←←1000 ; " 2 " ...
01100 EDOK←←40 ;RIGHTMOST OF 4 BITS (SHIFT BY CONTROL BITS) FOR LINE EDITOR LEGALITY
01200
01300 ;COMMAND DISPATCH FLAGS
01400 NOEDIT←←200000 ;DISPATCH DIRECTLY FROM LINE EDIT WITHOUT REPLACING LINE
01500 DOEDIT←←100000 ;REPLACE LINE BEFORE DISPATCHING FROM LINE EDIT
01600 ;IF NEITHER OF THE ABOVE, RE-EDIT LINE AT SAME CURSOR POS (CHAR IS NO-OP)
01700 NOATT←←40000 ;ILLEGAL IN ATTACH MODE
01800 NORDO←←20000 ;ILLEGAL IF READ-ONLY
01900 ;10000 ;USER MODE BIT MUST BE UNUSED
02000 SACMD←←4000 ;USES SEARCH ARG
02100 SSCMD←←2000 ;SPECIAL ACTION WHEN ENTERED FROM SEARCH
02200
02300 LPDESC←←3 ;# EXTRA WDS DIR ENTRY
02400 DPBIT←←400000 ;DIRPT ENTRY
02500 D1BIT←←200000 ;DIRP1 ENTRY
02600 RPMASK←←77 ;MASK FOR RELATIVE PAGE # FIELD
02700 RPBYTE←←<220600,,> ;BYTE PNTR FOR ABOVE
02800
02900 LLDESC←←3 ;# EXTRA WDS TEXT LINE
03000 PMARK←←400000 ;THIS LINE IS A PAGE MARK
03100 ARRBIT←←200000 ;LINE IS ARRLIN
03200 WINBIT←←100000 ;LINE IS WINLIN
03300 PTRBIT←←040000 ;LINE IS COMMENT OR REFERENCE POINTER
03400
03500 LOKBIT←←200000 ;LOCKS DOWN FS BLOCK (CAN'T BE SHUFFLED)
03600
03700 MAXLIN←←=42
03800 ATTMAX←←8
00100 DD←←20000 ;RUNNING ON DATA DISK
00200 III←←400000 ;" " III (BITS FROM GETLIN)
00300 SUPCCR←←2 ;BREAK TABLE BIT TO SUPPRESS CTRL1-CR HACK
00400 DVDSK←←200000 ;DISK BIT FROM DEVCHR
00500 MININT←←23 ;LOWEST INT BIT #
00600 ADRSIZ←←17 ;# BITS NEEDED TO ADDRESS PERMANENT CODE
00700
00800 ZZ←←.
00900 LOC 137
01000 IFN PURESW,<
01100 JRST [ NOESS,< MOVSI 'E '> ;UPPER NAME ONCE SYSTEMIFIED
01200 ESSAY,< MOVE ['ESSAY ']>
01300 SETNM2
01400 JRST 4,137
01500 MOVE P,[-LPDL+1,,PDL] ;Temp stack for checksum compute
01600 PUSHJ P,CHKUP ;Check upper segment before setpro
01700 MOVEM T,CHKSUM
01800 MOVNI 1
01900 SETUWP
02000 JRST 4,137
02100 MOVSI 155000
02200 SETPRO
02300 JRST 4,137
02400 CALLI 12]
02500 >
02600
02700 IFG DEBSW-PURESW,<
02800 JRST [ JSP E,PURINI
02900 CALLI 12]
03000 >
03100
03200 ORG ZZ
03300
03400 FOR @! FOO IN(SORRY,FATAL)
03500 {DEFINE FOO(X)
03600 { FOO!U [ASCIZ /X/]}
03700 }
00100 ;GETCHR, FSFIX, TSTSHF, CW, LEG, UUOS, XOPDEF, PURE, IMPURE,
00200
00300 DEFINE GETCHR(X)
00400 {ILDB C,INPNT
00500 SKIPGE X,CTAB(C)
00600 XCT @CTAB(C)}
00700
00800 DEFINE GETCH1(X)
00900 {ILDB C,INPNT
01000 TDNE X,CTAB(C)
01100 XCT @CTAB(C)}
01200
01300 DEFINE GETCH2(X,Y)
01400 { ILDB C,Y
01500 TDNE X,CTAB(C)
01600 XCT @CTAB(C)}
01700
01800 DEFINE FSFIX(X,Y)
01900 { HRRI Y,(X)
02000 SUB Y,FSEND
02100 LEG MOVEM Y,@FSEND
02200 LEG HRRZM Y,-1(X)
02300 HRRZM X,FSEND}
02400
02500 IFN DEBSW{DEFINE TSTSHF
02600 { SKIPE SHFMOD
02700 PUSHJ P,MOVIT}}
02800 IFE DEBSW{DEFINE TSTSHF{}}
02900
03000 DEFINE CW(C1,D1,C2,D2,C3,D3){BYTE(8)D1,D2,D3(3)C1,C2,C3,4}
03100
03200 ;THESE MACROS MAKE A LINKED LIST AROUND AND THROUGH
03300 ;PURE AND UNPURE PARTS FOR CHECKSUMING THE PURE PARTS
03400 ;AN ERROR WILL RESULT IF THE SAME MACRO IS CALLED
03500 ;TWICE WITHOUT CALLING THE OTHER MACRO.
03600 %SEG←←0
03700 IFE PURESW{
03800 DEFINE PURE{IFN %SEG{!} %SEG←←1 PURBEG←←.}
03900 DEFINE IMPURE{IFE %SEG{!} %SEG←←0
04000 PURBEG,,PURLK2↔PURLK2←←.-1
04100 PURBEG,,PURLNK↔PURLNK←←.-1}
04200 PURLNK←←PURLK2←←0}
04300
04400
04500 ;THESE MACROS SET RELOCATION TO THE PROPER SEGMENT FOR PURE OR UNPURE CODE
04600 ;AN ERROR MESSAGE WILL RESULT IF THE SAME MACRO IS CALLED TWICE WITHOUT
04700 ;CALLING THE OTHER MACRO.
04800 IFN PURESW{
04900 TWOSEG
05000 RELOC 400000
05100 RELOC
05200 DEFINE PURE{IFN %SEG{!} %SEG←←1 RELOC}
05300 DEFINE IMPURE{IFE %SEG{!} %SEG←←0 RELOC}}
05400
05500
05600 ;THIS MACRO SHOULD PRECEDE A LINE OF CODE WHICH CAN
05700 ;GENERATE A LEGAL ILL MEM REF.
05800 LEGNUM←←0
05900 DEFINE LEG{FOR @! X←LEGNUM,LEGNUM{LEG!X←←.} LEGNUM←←LEGNUM+1
06000 }
06100
06200
06300 DEFINE UUOS{FOR @! X IN(TYPCHR,TYPDEC,TYPOCT,SORRYU,FATALU,XTTYUU,SNEAKW,SNEAKS)}
06400
06500 ZZ←←0
06600 UUOS{ZZ←←ZZ+1
06700 OPDEF X[ZZ⊗33]
06800 }
06900
07000 DEFINE XOPDEF(X,AC){OPDEF X[XTTYUU AC,]}
07100 FOR X ⊂ ({INCHRW,0},{INCHRS,2},{INCHWL,4},{INCHSL,5})
07200 {XOPDEF ( X ) ↔ }
07300 NUUOS←←ZZ+1
07400
07500 EXTERN JOBREL,JOBFF,JOBAPR,JOBTPC,JOBDDT,JOBREN,JOBOPC,JOBCNI
07600 PURE
07700
00100 ;BEG, BEGSYS, BEGACT, BEGRPT, BEGDBG
00200
00300 IFN DEBSW,<JRST BEGDBG>
00400 JRST BEGRPT
00500 BEG: JRST BEG0 ;RUN OR ET COMMAND
00600 JRST BEGRPG ;RPG START. AC'S CONTAIN PARAMS
00700 MOVEM 16,EPDL ;SYSTEM AXXCOM START
00800 MOVEM 17,EPDL2 ;17[SIXBIT COMMAND, 16[ASCII DELIM
00900 JSP P,INIT ;INITIALIZE
01000 MOVE T,EPDL2 ;GET COMMAND NAME
01100 MOVEM T,SYSCMD ;STOW IT
01200 MOVE A,[440700,,BUF] ;INITIAL BYTE POINTER
01300 MOVE C,EPDL ;INITIAL CHARACTER IN "SCAN"
01400 ; PUSHJ P,TYIT
01500 ; JRST BEGACT
01600 ; SETACT [BRKTAB,,BRKTAB] ;APPARENT NO OP -- RPH
01700 INWAIT
01800 HRLOI T,377777 ;SET T INFINITE
01900 PUSHJ P,RSCN4A ;SCAN REMAINER OF COMMAND FOR ARGS
02000 BEGSYS: LDB C,[301400,,SYSCMD] ;GET 2 CHARACTERS OF COMMAND NAME
02100 PUSHJ P,SYSCCK ;DO WE KNOW THEM
02200 JRST BEG1 ;YES. NOW WE READ FILE NAME FROM TTY
02300 JRST BEG0 ;DONT UNDERSTAND COMMAND. RESCAN.
02400
02500 BEGACT: MOVE T,[440700,,[ASCIZ /
02600 /]]
02700 MOVEM T,TYIPNT
02800 JRST BEGSYS
02900
03000 BEGRPT: JSP P,INIT ;INITIALIZE
03100 PUSHJ P,TMPRED ;TRY TO READ TMPCORE FILE
03200 JRST BEG0A
03300 PUSH P,TYIPNT ;SAVE POINTER TO ARGS
03400 MOVEM G,TYIPNT ;POINT TO COMMAND
03500 PUSHJ P,GETNAM ;AND READ IT
03600 MOVEM A,SYSCMD
03700 POP P,TYIPNT ;NOW POINT TO ARGS AGAIN
03800 JRST BEGSYS ;AND LOOK LIKE AXXCOM STARTUP
03900
04000 IFN DEBSW,<
04100 BEGDBG: JSP P,INIT ;HERE FOR DEBUGGING. INITIALIZE
04200 INWAIT ;WAIT FOR SOMETHING TO BE TYPED
04300 HRLOI T,377777 ;SET CHARACTER COUNT TO INFINITE
04400 PUSHJ P,RSCAN0 ;READ COMMAND, AVOID RESCAN
04500 JRST BEG0A ;ACT NORMAL
04600 >
00100 ;BEGRPG
00200 ;HERE AT RPG STARTUP.
00300
00400 BEGRPG: MOVEM 17,RPGACS+17
00500 MOVEI 17,RPGACS
00600 BLT 17,RPGACS+16 ;SAVE RPG PARAMETERS
00700 JSP P,INIT0 ;INITIALIZE
00800 HRRZ T,RPGLIN
00900 CAILE T,=999
01000 SETZB T,RPGLIN
01100 MOVEM T,SLINE ;STARTING LINE NUMBER
01200 SKIPGE T,RPGPAG
01300 MOVEI T,
01400 MOVEM T,SPAGE ;STARTING PAGE NUMBER
01500 MOVSI T,'DSK'
01600 MOVEM T,EDFIL-1 ;DEFAULT DEVICE
01700 SKIPN T,RPGFIL
01800 JRST GETOU1 ;NO FILE NAME - NO EDIT. EXIT
01900 MOVEM T,EDFIL ;SAVE EDIT FILE NAME
02000 SKIPN T,RPGPPN
02100 MOVE T,PPN
02200 MOVEM T,EDFIL+3 ;EDIT FILE PPN
02300 MOVE T,RPGEXT
02400 HLLZM T,EDFIL+1 ;EDIT FILE EXT
02500 SETZM EDFIL+2
02600 SETZM EDFIL+4
02700 HRLOI TT,1
02800 TRNE T,100000 ;INSPECT MODE FLAGS
02900 MOVEM TT,EDFIL+4 ;SET /N NO DIRECTORY
03000 TRNE T,400000
03100 SETOM CREASW ;CREATING
03200 TRNE T,200000
03300 SETOM RDONLY ;/R READONLY
03400 PUSHJ P,ZLIST ;SAVE ALL THIS SHINY NEW DATA IN ZDATA
03500 JRST BEG3
03600
03700 IMPURE
03800 RPGACS: BLOCK 11 ;PLACE TO SAVE RPG PARAMETERS
03900 RPGPPN: 0
04000 0
04100 RPGEXT: 0
04200 RPGFIL: 0
04300 RPGLIN: 0
04400 RPGPAG: 0
04500 0
04600 PURE
00100 ;BEG0, BEG1, BEG1A, BEG2, BEGBKP
00200
00300 BEG0: JSP P,INIT ;INITIALIZE
00400 BEG0.1: PUSHJ P,RSCAN ;RESCAN TTY
00500 BEG0A: SKIPN TYIPNT ;WAS THERE ANYTHING THERE?
00600 OUTSTR [ASCIZ /
00700 FILE? /] ;NO. ASK FOR SOME.
00800 BEG1: MOVEI D,EDFIL ;POINTER TO DEPOSIT?
00900 LDB C,[301400,,SYSCMD] ;GET THE COMMAND NAME
01000 PUSHJ P,CRECHK ;WAS IT CREATE?
01100 JRST [SETOM CREASW ;YES. SET FLAG
01200 JRST BEGSY2]
01300 IFN BOOKMD, {
01400 CAIN C,'RE' ;"READ" COMMAND?
01500 JRST BEGBKP ;YES
01600 };END BOOKMD
01700 JUMPN C,BEGSY1 ;WAS IT SOME SORT OF COMMAND AT ALL?
01800 BEGSY2: PUSHJ P,FRD ;READ FILE NAME (TTY OR RESCANNED DATA)
01900 JRST FNERR ;OOPS.
02000 BEGSY3: SKIPN EDFIL
02100 JRST GETOU1
02200 HLLM D,SRCFIL
02300 HLLM D,DSTFIL
02400 IFN BOOKMD, {
02500 SKIPN BKPSW ;"READ" COMMAND USED?
02600 JRST BEGSY4 ;NO
02700 PUSH P,C
02800 PUSHJ P,BKPRED ;LOOK FOR <FILENM>.BKP FILE (LIKE RPG FILE)
02900 POP P,C
03000 SETOM BOOKSW ;BKPSW IMPLIES BOOKSW
03100 SETOM RDONLY ;BOOKSW IMPLIES RDONLY
03200 JRST BEG1A
03300 BEGSY4:
03400 };END BOOKMD
03500 TLNN D,740 ;ANY FILENAME, EXTENSION, OR PPN SPECIFIED?
03600 JRST BEG1B ;NO
03700 MOVEI G,(C)
03800 PUSHJ P,TMPWRT
03900 LDB C,[301400,,SYSCMD]
04000 PUSHJ P,CRECHK
04100 SETOM CREASW
04200 MOVEI C,(G)
04300 BEG1B: CAIE C,"←"
04400 CAIN C,"→"
04500 TROA F,COPY
04600 JRST BEG1A
04700 MOVEM C,TRMCHR#
04800 MOVEI D,EDFIL2
04900 PUSHJ P,FRD
05000 JRST FNERR
05100 MOVE G,[,SRCFIL-EDFIL2(A)]
05200 CAIN C,"→"
05300 HRRI G,DSTFIL-EDFIL2
05400 MOVE A,[-5,,EDFIL2]
05500 HRRZM A,@G
05600 AOBJN A,.-1
05700 HLLM D,EDFIL2(G)
05800 SKIPN @SRCFIL
05900 SETOM CREASW
06000 BEG1A: PUSHJ P,TYIT
06100 JRST BEG3
06200 BEG2: PUSHJ P,TYI
06300 JRST BEG3
06400 JRST BEG2
06500
06600 FLOSE: SUB P,[1,,1]
06700 FNERR: OUTSTR [ASCIZ /ILLEGAL FILE SPECIFICATION./]
06800 JRST FNF1
06900
07000 IFN BOOKMD, {
07100 BEGBKP: SETOM BKPSW# ;BKPSW MEANS WE WERE STARTED BY "READ" CMD TO USE .BKP FILE
07200 SETOM BOOKSW# ;BOOKSW MEANS WE ARE IN /B MODE--NO FILE MODIFYING ALLOWED
07300 };END BOOKMD
07400 BEGSY1: MOVE H,TYIPNT
07500 SKIPN TCPNT
07600 PUSHJ P,TMPRED
07700 JRST BEGSY2
07800 PUSHJ P,FRD
07900 JFCL
08000 MOVEM H,TYIPNT
08100 HRLI D,200000
08200 PUSHJ P,FRD0
08300 JRST FNERR
08400 JRST BEGSY3
00100 ;BEG3,BEG4
00200
00300 BEG3: PUSHJ P,SNKON
00400 PUSHJ P,DPYSKI
00500 SKIPE CREASW
00600 PUSHJ P,CREATE
00700 BEG4: MOVEI D,@SRCFIL
00800 MOVEI A,1
00900 PUSHJ P,OPENI
01000 JRST FNF
01100 MOVE T,@SRCFIL+4
01200 AOS SRCFIL+4
01300 MOVEM T,@SRCFIL+4
01400 SKIPN DIR
01500 PUSHJ P,GETDIR
01600 MOVE T,EDFIL+4
01700 TRNN F,COPY
01800 IOR T,@SRCFIL+4
01900 ADDI T,1
02000 HRRZM T,DIRPAG#
02100 PUSHJ P,COPFIL
02200 MOVEI D,EDFIL
02300 MOVEI A,1
02400 PUSHJ P,OPNOI
02500 PUSHJ P,OPNLUZ
02600 TRZE F,UPDTXT
02700 PUSHJ P,OUTDIR ;GETDIR ASKING FOR WRITE
02800 MOVE A,[ASCID / /]
02900 MOVEM A,HEDNAM
03000 HRRZM A,HEDNAM+1
03100 MOVE A,[HEDNAM+1,,HEDNAM+2]
03200 BLT A,ROFLG-1
03300 MOVE A,[260700,,HEDNAM]
03400 MOVEM A,TYOPNT
03500 MOVEI D,EDFIL
03600 PUSHJ P,FILSTR
03700 MOVEI A,<BYTE(7),,,"/","R"(1)1>
03800 SKIPE RDONLY
03900 TROA F,REDNLY
04000 MOVEI A,1
04100 IFN BOOKMD, {
04200 SKIPE BOOKSW
04300 MOVEI A,<BYTE(7),,,"/","B"(1)1>
04400 };END BOOKMD
04500 MOVEM A,ROFLG
04600 MOVE A,[HEDNAM,,HED2NM]
04700 BLT A,ROFLG2
04800 MOVE T,PAGES
04900 CAIE T,2
05000 MOVEI T,1
05100 SKIPGE A,SPAGE ;FIRST PAGE TO LOOK AT
05200 MOVEI A,-1(T) ;NONE - ASSUME DIR
05300 ADD A,DIRPAG
05400 JUMPG A,.+2
05500 MOVEI A,1
05600 PUSHJ P,RDPAGE
05700 JFCL
05800 SKIPE MARKS ;Are there any line marks
05900 PUSHJ P,XMPAGE ;Yes, so get last mark on page data
06000 TRNE F,REDNLY!DIROK
06100 JRST .+3
06200 TRO F,COPY
06300 JRST BEG4
06400 SETZM TYIPNT
06500 PUSHJ P,DPYINI
06600 PUSHJ P,PGINIT
06700 PUSHJ P,TMPWRT
06800 IFN BOOKMD, {
06900 SKIPGE A,NEWBKP
07000 OUTSTR [ASCIZ /WILL CREATE .BKP FILE
07100 /]
07200 };END BOOKMD
07300 HLRZ A,RPGLIN
07400 TRNE A,376000
07500 JRST MAIN
07600 TRZN A,400000
07700 JUMPG A,[MOVEM A,EDMOV↔MOVE D,CMDSP-1↔MOVEI A,↔JRST MAIN2]
07800 TLNN F,ZATT ;To preserve ATTACH status if necessary
07900 PUSHJ P,ATTACH
08000 JFCL